import * as React from "react"; import Link from "next/link"; import { Metadata } from "next"; import { getServerSession } from "next-auth/next"; import { authOptions } from "@/app/api/auth/[...nextauth]/route"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { LogIn, Edit, Eye, Ellipsis } from "lucide-react"; import { Shell } from "@/components/shell"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { unstable_noStore as noStore } from 'next/cache'; import { getAllPQsByVendorId, getPQStatusCounts } from "@/lib/pq/service"; import { InformationButton } from "@/components/information/information-button"; import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, } from "@/components/ui/dropdown-menu"; export const metadata: Metadata = { title: "사전 평가 (PQ) 목록", description: "요청된 사전 평가 목록을 확인하고 작성합니다.", }; // 페이지가 기본적으로 동적임을 나타냄 export const dynamic = "force-dynamic"; function getStatusBadge(status: string) { switch (status) { case "REQUESTED": return 요청됨; case "IN_PROGRESS": return 진행 중; case "SUBMITTED": return 제출됨; case "APPROVED": return 승인됨; case "REJECTED": return 거부됨; default: return {status}; } } function getFormattedDate(date: Date | null) { if (!date) return "-"; return new Intl.DateTimeFormat("ko-KR", { year: "numeric", month: "2-digit", day: "2-digit", }).format(new Date(date)); } export default async function PQListPage() { // 캐시 비활성화 noStore(); // 인증 확인 const session = await getServerSession(authOptions); // 로그인 확인 if (!session || !session.user) { return (

사전 평가 (PQ) 목록

요청된 사전 평가 목록을 확인하고 작성합니다.

로그인이 필요합니다

사전 평가를 확인하려면 먼저 로그인하세요.

); } // 세션에서 vendorId 가져오기 const vendorId = session.user.companyId; // 벤더 권한 확인 if (session.user.domain !== "partners" || !vendorId) { return (

접근 권한 없음

벤더 계정이 필요합니다

벤더 계정으로 로그인해주세요.

); } const idAsNumber = Number(vendorId); // 데이터 가져오기 (병렬 실행) const [pqList, pqStatusCounts] = await Promise.all([ getAllPQsByVendorId(idAsNumber), getPQStatusCounts(idAsNumber), ]); return (

사전 평가 (PQ) 목록

요청된 사전 평가 목록을 확인하고 작성합니다.

{/* PQ 상태 요약 카드 */}
총 PQ
{Object.values(pqStatusCounts).reduce((sum, count) => sum + count, 0)}건
작성 대기
{(pqStatusCounts.REQUESTED || 0) + (pqStatusCounts.IN_PROGRESS || 0)}건
제출됨
{pqStatusCounts.SUBMITTED || 0}건
승인됨
{pqStatusCounts.APPROVED || 0}건
{/* PQ 목록 테이블 */} PQ 목록 유형 PQ 번호 프로젝트 상태 요청일 제출일 승인일 액션 {pqList.length === 0 ? ( 요청된 PQ가 없습니다. ) : ( pqList.map((pq) => { const canEdit = ["REQUESTED", "IN_PROGRESS", "REJECTED"].includes(pq.status); const canView = ["SUBMITTED", "APPROVED"].includes(pq.status); return ( {pq.type === "PROJECT" ? "프로젝트" : pq.type === "NON_INSPECTION" ? "미실사" : "일반"} {pq.pqNumber || "-"} {pq.projectName || "-"} {getStatusBadge(pq.status)} {getFormattedDate(pq.createdAt)} {getFormattedDate(pq.submittedAt)} {getFormattedDate(pq.approvedAt)} {canEdit && ( 작성 )} {canView && ( 보기 )} ); }) )}
); }